#pragma once
#include <vector>
#include <array>
#include <fstream>
#include <string>
#include "SurfaceExtractor.h"

/**
 * @brief 三维空间范围结构体
 */
struct SpaceRange {
    double x_min, x_max;
    double y_min, y_max;
    double z_min, z_max;
};

/**
 * @brief 四面体单元结构体
 */
struct Tetrahedron {
    size_t v1, v2, v3, v4;  // 四个顶点的索引
};

/**
 * @brief 网格生成器类
 */
class GridGenerator {
public:
    /**
     * @brief 构造函数
     * @param surfaces 地层界面提取器
     * @param gridSize 基础网格尺寸
     */
    GridGenerator(const SurfaceExtractor& surfaces, double gridSize);

    /**
     * @brief 析构函数
     */
    ~GridGenerator() {
        if (logFile.is_open()) {
            logFile.close();
        }
    }

    /**
     * @brief 生成初始规则网格
     * @return 是否成功生成
     */
    bool generateInitialGrid();

    /**
     * @brief 输出网格到VTK文件
     * @param filename 输出文件名
     */
    void writeToVTK(const std::string& filename);

    const std::vector<Point3D>& getNodes() const { return nodes; }
    const std::vector<Tetrahedron>& getElements() const { return elements; }

    // 添加获取空间范围的方法
    double getXMin() const { return range.x_min; }
    double getXMax() const { return range.x_max; }
    double getYMin() const { return range.y_min; }
    double getYMax() const { return range.y_max; }
    double getZMin() const { return range.z_min; }
    double getZMax() const { return range.z_max; }

    // 添加获取实际网格尺寸的方法
    double getActualDX() const { return actual_dx_; }
    double getActualDY() const { return actual_dy_; }
    double getActualDZ() const { return actual_dz_; }

private:
    /**
     * @brief 计算空间范围
     */
    void computeSpaceRange();

    /**
     * @brief 生成规则点网格
     */
    void generateNodes();

    /**
     * @brief 生成四面体单元
     */
    void generateTetrahedra();

    const SurfaceExtractor& surfaceExtractor;  // 界面提取器引用
    double gridSize;                           // 基础网格尺寸
    SpaceRange range;                          // 空间范围
    std::vector<Point3D> nodes;                // 网格节点
    std::vector<Tetrahedron> elements;         // 四面体单元
    mutable std::ofstream logFile;             // 日志文件

    // 添加实际网格尺寸成员变量
    double actual_dx_;
    double actual_dy_;
    double actual_dz_;
}; 